package com.topscomm.core.factory;

import java.io.InputStream;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.topscomm.core.FileStoreTypeEnum;
import com.topscomm.core.IFileStoreService;
import com.topscomm.file.FileInfoDTO;

/**
 * 文件服务工厂类 上传服务统一使用minio，为了兼容之前的文件，下载支持多种方式
 * 
 * @description:
 * @author: donghang
 * @date: 2021年3月13日下午10:28:22
 * @modify:
 */
public class FileStoreFactoryService implements IFileStoreService {

	private Map<FileStoreTypeEnum, IFileStoreService> serviceMap = new ConcurrentHashMap<>();
	private IFileStoreService uploadService;

	public FileStoreFactoryService(IFileStoreService uploadService) {
		this.uploadService = uploadService;
	}

	/**
	 * 添加文件服务
	 * 
	 * @description:
	 * @param fileStoreTypeEnum
	 * @param storeService
	 * @author: donghang
	 * @date: 2021年3月14日下午10:11:25
	 * @modify:
	 */
	public void addStoreService(FileStoreTypeEnum fileStoreTypeEnum, IFileStoreService storeService) {
		serviceMap.put(fileStoreTypeEnum, storeService);
	}

	/**
	 * 移除文件服务
	 * 
	 * @description:
	 * @param fileStoreTypeEnum
	 * @author: donghang
	 * @date: 2021年3月14日下午10:11:45
	 * @modify:
	 */
	public void removeStoreService(FileStoreTypeEnum fileStoreTypeEnum) {
		serviceMap.remove(fileStoreTypeEnum);
	}

	/**
	 * 上传预签名的文件流
	 * 
	 * @description:
	 * @param inputStream
	 * @param httpUrl
	 * @return
	 * @throws Exception
	 * @author: donghang
	 * @date: 2021年3月18日下午3:22:24
	 * @modify:
	 */
	@Override
	public String uploadPresigned(InputStream inputStream, String httpUrl) throws Exception {
		return uploadService.uploadPresigned(inputStream, httpUrl);
	}

	/**
	 * 得到初始化的预签名地址
	 * 
	 * @description:
	 * @param fileInfo
	 * @return
	 * @author: donghang
	 * @date: 2021年3月18日下午2:26:49
	 * @modify:
	 */
	public Map<String, Object> initMultiPartUpload(FileInfoDTO fileInfo) {
		return uploadService.initMultiPartUpload(fileInfo);
	}

	/**
	 * 合并文件请求
	 * 
	 * @description:
	 * @param fileInfo
	 * @param uploadId
	 * @return
	 * @author: donghang
	 * @date: 2021年3月18日下午2:27:24
	 * @modify:
	 */
	public boolean mergeMultipartUpload(FileInfoDTO fileInfo, String uploadId) {
		return uploadService.mergeMultipartUpload(fileInfo, uploadId);
	}

	/**
	 * 通过路径上传
	 * 
	 * @description:
	 * @param filePath
	 * @return
	 * @throws Exception
	 * @author: donghang
	 * @date: 2021年3月16日下午1:48:01
	 * @modify:
	 */
	@Override
	public String upload(FileInfoDTO fileInfo) throws Exception {
		return uploadService.upload(fileInfo);
	}

	/**
	 * 上传
	 * 
	 * @description:
	 * @param inputStream
	 * @param fileName
	 * @return
	 * @throws Exception
	 * @author: donghang
	 * @date: 2021年3月14日下午10:12:39
	 * @modify:
	 */
	@Override
	public String upload(InputStream inputStream, FileInfoDTO fileInfo) throws Exception {
		return uploadService.upload(inputStream, fileInfo);
	}

	/**
	 * 删除
	 * 
	 * @description:
	 * @param fileId
	 * @throws Exception
	 * @author: donghang
	 * @date: 2021年3月14日下午10:12:47
	 * @modify:
	 */
	@Override
	public void delete(FileInfoDTO fileInfo) throws Exception {
		chose(fileInfo.getStorageType()).delete(fileInfo);
	}

	/**
	 * 下载文件流
	 * 
	 * @description:
	 * @param fileId
	 * @param outputStream
	 * @throws Exception
	 * @author: donghang
	 * @date: 2021年3月14日下午10:12:58
	 * @modify:
	 */
	@Override
	public InputStream downLoad(FileInfoDTO fileInfo) throws Exception {
		return chose(fileInfo.getStorageType()).downLoad(fileInfo);
	}

	/**
	 * 下载文件到本地
	 * 
	 * @description:
	 * @param fileInfo
	 * @param filePath
	 * @throws Exception
	 * @author: donghang
	 * @date: 2021年3月18日下午11:27:17
	 * @modify:
	 */
	@Override
	public void downLoad(FileInfoDTO fileInfo, String filePath) throws Exception {
		chose(fileInfo.getStorageType()).downLoad(fileInfo, filePath);
	}

	/**
	 * 访问url
	 * 
	 * @description:
	 * @param fileInfo
	 * @return
	 * @author: donghang
	 * @date: 2021年4月1日下午11:57:11
	 * @modify:
	 */
	@Override
	public String accessUrl(FileInfoDTO fileInfo) {
		return chose(fileInfo.getStorageType()).accessUrl(fileInfo);
	}

	/**
	 * 根据文件信息得到相关的文件服务类
	 * 
	 * @description:
	 * @param fileId
	 * @return
	 * @author: donghang
	 * @date: 2021年3月16日下午5:55:25
	 * @modify:
	 */
	private IFileStoreService chose(String storageType) {
		FileStoreTypeEnum protocol = FileStoreTypeEnum.protocol(storageType);
		if (protocol == null) {
			throw new RuntimeException(storageType + "存储协议不支持");
		}
		return serviceMap.get(protocol);
	}

	/**
	 * 得到协议
	 * 
	 * @description:
	 * @return
	 * @author: donghang
	 * @date: 2021年4月10日上午11:08:32
	 * @modify:
	 */
	@Override
	public String getStoreProtocol() {
		return uploadService.getStoreProtocol();
	}

	/**
	 * 
	 * @description:
	 * @param fileInfo
	 * @return
	 * @author: donghang
	 * @date: 2021年3月18日下午3:36:03
	 * @modify:
	 */
	@Override
	public String getUpdateId(FileInfoDTO fileInfo) {
		return uploadService.getUpdateId(fileInfo);
	}

	@Override
	public boolean fileIsExist(FileInfoDTO fileInfo) {
		return chose(fileInfo.getStorageType()).fileIsExist(fileInfo);
	}

}
